package ar.edu.caece.pl.asin.model.impl;

import ar.edu.caece.pl.alex.model.IToken;
import ar.edu.caece.pl.alex.model.impl.Token;
import ar.edu.caece.pl.asin.manager.IAnalizadorSintactico;
import ar.edu.caece.pl.asin.manager.impl.AbstractAnalizadorSintactico;
import ar.edu.caece.pl.asin.model.ITokenStream;

public class Var extends AbstractAnalizadorSintactico implements IAnalizadorSintactico {

	/* INICIALIZACION */	
	public Var ( ITokenStream ts ) {
		super(ts, false);
	}
	public Var ( ITokenStream ts, boolean debugMode ) {
		super(ts,debugMode);
	}
	
	
	/**
	 * Devuelve true si reconoce una variable
	 */
	public boolean reconocer () {
		
		boolean recognized = true; //(asumimos correctitud hasta demostrar lo contrario)
		
		//----------------------------------------------
		//Agrego info de debug de la produccion
		em.debug( "<VAR> -> IDENTIFICADOR <VAR_1>", this.getTokenSiguiente() );
		//----------------------------------------------
		
		/* <VAR> --> IDENTIFICADOR <VAR_1> */
		
		if ( this.getTokenSiguiente().getType() == IToken.TYPE_IDENTIFICADOR ) {
			
			while ( this.getTokenSiguiente().getType() == IToken.TYPE_IDENTIFICADOR ) {
				
				//Reconocer Identificador
				if ( !this.reconocerToken(IToken.TYPE_IDENTIFICADOR) ) {
					//El reconocerToken() habria adelantado el tokenStream hasta salir de esta iteracion de Var,
					//entonces no hay que seguir buscando sino salir
					return false;
				}
				
				IAnalizadorSintactico var1 = new Var1(this.tokenStream, this.debugMode);
				recognized &= var1.reconocer();
			}
			
		} else {
			
			//No deberia darse el caso, pero si se llama a reconocer() en un estado incorrecto deberia salir por aqui
			em.error("Se esperaba token "+ this.dic.getTokenDescription(IToken.TYPE_IDENTIFICADOR), this.getTokenSiguiente());
			recognized = false;
			
			//Tratamiento de errores
			em.recover(this.getClass(), this.tokenStream);
		}
		
		//Finalmente terminamos de reconocer esta derivacion de Header
		return recognized;
	}
	
	public static boolean primeros(IToken token) {
		return  token.equals( new Token(IToken.TYPE_IDENTIFICADOR) );
	}
}
